#ifndef __MID_SCHEDULER_H
#define __MID_SCHEDULER_H

#include "main.h"
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Configuration: 可按需调整，但请保持 SCHED_MAX_TASKS <= 255 */
#ifndef SCHED_MAX_TASKS
#define SCHED_MAX_TASKS    8
#endif

#ifndef SCHED_MAX_PRIORITY
#define SCHED_MAX_PRIORITY 16
#endif

/* 是否启用任务运行超时检测（默认禁用） */
#ifndef SCHED_ENABLE_TASK_WATCHDOG
#define SCHED_ENABLE_TASK_WATCHDOG 0
#endif

/* 任务运行超时阈值 (ms)，仅在 SCHED_ENABLE_TASK_WATCHDOG == 1 时有效 */
#ifndef SCHED_TASK_WATCHDOG_MS
#define SCHED_TASK_WATCHDOG_MS 1000
#endif

typedef uint8_t tid_t;   /* 任务 ID 类型 */
typedef uint32_t evt_t;  /* 事件掩码类型 */

typedef void (*task_fn_t)(tid_t tid, evt_t events);

typedef enum {
    TASK_STATE_READY = 0,
    TASK_STATE_RUNNING,
    TASK_STATE_WAITING,   /* TaskDelay / StartDelayedEvent */
    TASK_STATE_SUSPENDED,
	TASK_STATE_DELETED
} task_state_t;

/* 初始化（在 HAL_Init()、SystemClock_Config() 后调用） */
void SchedOpt_Init(void);

/* 创建任务 -> 返回 tid；失败返回 0xFF */
tid_t SchedOpt_CreateTask(task_fn_t fn, uint8_t priority);

/* 永久运行（阻塞） */
void SchedOpt_RunForever(void);

/* 运行一次循环（便于测试/集成） */
void SchedOpt_RunOnce(void);

/* 主线程设置事件（会使任务 READY） */
void SchedOpt_SetEvent(tid_t tid, evt_t evt);

/* ISR 中设置事件（ISR-safe）——不会直接修改队列 */
void SchedOpt_SetEventFromISR(tid_t tid, evt_t evt);

/* 清除事件（主线程+ISR 标志均清除） */
void SchedOpt_ClearEvent(tid_t tid, evt_t evt);

/* 延时事件：对evt事件延时delay_ms，不延时任务 */
void SchedOpt_StartDelayedEvent(tid_t tid, evt_t evt, uint32_t delay_ms);

/* 任务挂起一段时间（不附带事件），到期自动 READY */
void SchedOpt_TaskDelay(tid_t tid, uint32_t delay_ms);

/* 将任务挂起（从就绪队列移除并设置为 SUSPENDED） */
void SchedOpt_SuspendTask(tid_t tid);

/* 恢复任务到 READY 并入队（如果已经在队列则什么也不做） */
void SchedOpt_ResumeTask(tid_t tid);

/* 删除任务：从队列移除并使其不再被调度（fn 置 NULL） */
void SchedOpt_DeleteTask(tid_t tid);

/* 获取系统 tick（ms），默认基于 HAL_GetTick() */
uint32_t SchedOpt_GetTick(void);

#ifdef __cplusplus
}
#endif

#endif
